package gestion.camping.controleur;

import gestion.camping.connexion.Connexion;
import gestion.camping.dao.impl.FraisReservationDao;
import gestion.camping.dto.FraisReservation;
import gestion.camping.vue.ViewFraisReservationDetail;
import gestion.camping.vue.ViewFraisReservationListe;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;

public class FraisReservationController{
	
	private FraisReservation fraisReservation;
	private List<FraisReservation> listFraisReservation;
	private FraisReservationDao fraisReservationDao = new FraisReservationDao(Connexion.getInstance());
	private ViewFraisReservationDetail frameDetail;
	private ViewFraisReservationListe frameListe;
	private boolean isPossibleEnregistrer;
	
	/**
	 * Constructeur du controlleur saison
	 */
	public FraisReservationController(){
		this.isPossibleEnregistrer = true;
	}
	
	public FraisReservationController(boolean isPossibleEnregistrer){
		this.isPossibleEnregistrer = isPossibleEnregistrer;
	}

	/**
	 * Accesseur à l'attribut saison
	 * @return saison
	 */
	public FraisReservation getFraisReservation() {
		return fraisReservation;
	}

	/**
	 * Permet la modification de l'attribut saison de l'instance courante
	 * @param saison
	 */
	public void setFraisReservation(FraisReservation fraisReservation) {
		this.fraisReservation = fraisReservation;
	}
	
	/**
	 * Accesseur aux JPanel contenant la liste des saisons
	 * @return JPanel viewListe
	 */
	public ViewFraisReservationListe getViewListe(){
		
		if(listFraisReservation == null){
			listFraisReservation = new ArrayList<FraisReservation>();
		}
		
		
		//On crée la fenêtre
		frameListe = new ViewFraisReservationListe(this);
	
		rechercher();
		
		return frameListe;
	}
	
	/**
	 * Accesseur aux JPanel contenant le détail d'une personne
	 * @return JPanel viewDetail
	 */
	public JDialog getViewDetail(){
		
		// Si personne est différent de null 
		if(fraisReservation == null){
			//on est en création
			//On crée un objet vide
			fraisReservation = new FraisReservation();
		}
				
		//On crée la fenêtre
		frameDetail = new ViewFraisReservationDetail(this);
		
		frameDetail.setVisible(true);
		
		return frameDetail;
	}

	/**
	 * Accesseur à la liste des saisons
	 * @return Liste des saisons
	 */
	public List<FraisReservation> getListFraisReservation() {
		return listFraisReservation;
	}

	/**
	 * Permet la modification de la liste de saison
	 * @param listSaison
	 */
	public void setListFraisReservation(List<FraisReservation> listFraisReservation) {
		this.listFraisReservation = listFraisReservation;
	}

	/**
	 * Permet la gestion de l'action utilisateur Enregistrer
	 * @param personne
	 */
	public void enregistrer(FraisReservation fraisReservation) {
		System.out.println(fraisReservation.toString());
		
		this.fraisReservation = fraisReservation;
			
		if(isPossibleEnregistrer){
			//Si l'ID est zéro
			FraisReservation fraisResa = fraisReservationDao.find(fraisReservation.getAnnee());
			
			if(fraisResa.getAnnee() == 0){ 
				//On est en création
				fraisReservation = fraisReservationDao.create(fraisReservation);
			}else{
				//On n'est en modification
				fraisReservation = fraisReservationDao.update(fraisReservation);
			}
			frameDetail.setFraisReservation(fraisReservation);
		}			
	}		


	/**
	 * Permet la gestion de l'action utilisateur Rechercher
	 */
	public void rechercher() {
		this.listFraisReservation = fraisReservationDao.findAllFraisReservation();
		frameListe.setListFraisReservation(listFraisReservation);
	}

	/**
	 * Permet la gestion de l'action utilisateur Modifier
	 * @param personne
	 */
	public void modifier(FraisReservation fraisReservation) {
		//On affecte la saison que l'on veut modifier	
		this.fraisReservation = fraisReservation;
		
		//On affiche la fenêtre de détail
		this.getViewDetail();
	}

	/**
	 * Permet la gestion de l'action utilisateur Retour à liste 
	 */
	public void retour() {
		if(isPossibleEnregistrer){
			//Si une recherche avait été faite
			if(listFraisReservation != null && listFraisReservation.size() > 0){
				//On effectue la dernière recherche
				rechercher();
			}
		}else{
			if(listFraisReservation != null){
				//On recherche si la personne et déja présente dans la lite
				int i;
				for(i=0; i<listFraisReservation.size() && listFraisReservation.get(i).getAnnee() != fraisReservation.getAnnee(); i++);
				if(i == listFraisReservation.size()){
					listFraisReservation.add(fraisReservation);
				}else{
					listFraisReservation.remove(i); 
					listFraisReservation.add(i, fraisReservation);
				}
				
				//On met à jour la fenêtre
				frameListe.setListFraisReservation(listFraisReservation);
				
			}
		}
		
	}
	

	/**
	 * Permet la gestion de l'action utilisateur Ajouter 
	 */
	public void ajouter(){
		this.fraisReservation = new FraisReservation();
		
		
		this.getViewDetail();
	}

	public boolean isPossibleEnregistrer() {
		return isPossibleEnregistrer;
	}

	public void setPossibleEnregistrer(boolean isPossibleEnregistrer) {
		this.isPossibleEnregistrer = isPossibleEnregistrer;
	}
	
}
